package com.atguigu.juc.day01;

/**
 * @author atguigu-mqx
 */
class Phone{
    //  编写两个同步方法： 一个方法叫发短信，一个方法叫发送邮件！
    public static synchronized void sendMsg() throws InterruptedException {
            Thread.sleep(4000);
            System.out.println("发送短信");
    }

    public synchronized void sendEmail(){

            System.out.println("发送邮件");

    }

    //  编写一个普通方法
    public void hello(){
        System.out.println("hello!");
    }

    public synchronized void aa(){
        //  调用bb() 方法
        bb();
        System.out.println("aaaa");
    }

    private synchronized void bb() {
        System.out.println("bbb");
    }

}
public class Lock_8 {
    /*
    线程的执行是通过cpu 分配资源： 谁先抢到，谁先执行！
    1. 标准访问，先打印短信还是邮件
        先短信，再邮件！
    2. 停4秒在短信方法内，先打印短信还是邮件
        先短信，再邮件！
        两个方法属于同步方法：执行顺序，调用短信时，睡了4秒中！ 当睡眠醒了以后，可以释放锁！ 再次去执行发送邮件方法！
        说明：这个两个方法使用的是同一把锁！ 如果不是同一把锁，锁不住资源！

        this: 表示当前对象

    3. 普通的hello方法，是先打短信还是hello
        先hello 再短信： 执行的顺序虽然是先打印短信，但是短信中有睡眠，相当于线程阻塞了。普通方法没有睡眠。

    4. 现在有两部手机，先打印短信还是邮件
        先邮件，再短信：  说明这两个同步方法 不是同一把锁！
        这个锁是谁呢?  调用短信时第一个锁的对象：this--> phone 调用邮件时第二个锁对象：this--->phone2

    5. 两个静态同步方法，1部手机，先打印短信还是邮件
        先短信，再邮件！ 说明是同一把锁！ 这个锁是谁呢? 这个锁还能是 this 么?
            不是！ 为什么?
            静态方法中是否能有this 关键字出现? 不能！
            static 关键字的特点： a. 随着类的加载而加载  b. 优先于对象的存在  c. 类.方法名();

            那么这个锁对象是谁呢? Phone.class

    6. 两个静态同步方法，2部手机，先打印短信还是邮件
        先短信，再邮件：
            使用的同一把锁！ Phone.class

    7. 1个静态同步方法，1个普通同步方法，1部手机，先打印短信还是邮件
        先邮件，再短信！ 说明使用的不是同一把锁！
        邮件： this
        短信： Phone.class

    8. 1个静态同步方法，1个普通同步方法，2部手机，先打印短信还是邮件
        先邮件，再短信！ 说明使用的不是同一把锁！
        邮件： this  phone2
        短信： Phone.class

     */
    //  主入口：
    public static void main(String[] args) {
        //  多线程操作模板上：线程操作资源类， 高内聚低耦合！
                Phone phone = new Phone();
                phone.aa();
        //        Phone phone2 = new Phone();
        //
        //        //  创建线程：
        //        new Thread(()->{
        //            try {
        //                //  同步方法 睡4s秒钟
        //                phone.sendMsg();
        //            } catch (InterruptedException e) {
        //                e.printStackTrace();
        //            }
        //        },"AA").start();
        //
        //        new Thread(()->{
        ////              phone.sendEmail();
        //            phone2.sendEmail();
        //            //  属于普通方法！
        //            //  phone.hello();
        //        },"BB").start();




    }
}
